package com.zzl.java8.czbk.lambda.sort.demo1;

import org.junit.jupiter.api.Test;

import java.util.Arrays;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * description: 数组排序小样儿1
 * @author 朱正磊
 * @date 2022-06-26 17:21:52
 */
public class ArraySortedDemo1 {

    /**
     * description: 测试对整型数组进行冒泡排序（升序排序）
     * @author 朱正磊
     * @date 2022-06-26 17:28:58
     */
    @Test
    void test1() {
        int[] intArray = {3, 6, 9, 1, 4, 8, 7, 0, 5};
        System.out.println("开始进行升序排序...");
        // 使用冒泡排序（升序排序）
        this.sortedAsc(intArray);
        Stream<int[]> stream = Stream.of(intArray);
        Stream<Integer> integerStream = stream.flatMap(x -> Arrays.stream(x).boxed());
        String collect = integerStream.map(String::valueOf).collect(Collectors.joining(", "));
        // collect = 0, 1, 3, 4, 5, 6, 7, 8, 9
        System.out.println("collect = " + collect);
    }

    /**
     * description: 对整型数组使用冒泡排序（升序排序）
     * @author 朱正磊
     * @date 2022-06-26 17:38:35
     * @param intArray 整型数组
     */
    private void sortedAsc(int[] intArray) {
        for (int i = 0; i < intArray.length; i++) {
            for (int j = i + 1; j < intArray.length; j++) {
                // 如果前一个数比后一个数大，那么交换顺序（升序）
                if (intArray[i] > intArray[j]) {
                    int temp = intArray[i];
                    intArray[i] = intArray[j];
                    intArray[j] = temp;
                }
            }
        }
    }

    /**
     * description: 测试对整型数组使用冒泡排序（降序排序）
     * @author 朱正磊
     * @date 2022-06-27 10:17:09
     */
    @Test
    void test2() {
        int[] intArray = {3, 6, 9, 1, 4, 8, 7, 0, 5};
        System.out.println("开始进行降序排序...");
        // 使用冒泡排序（降序排序）
        this.sortedDesc(intArray);
        Stream<int[]> stream = Stream.of(intArray);
        Stream<Integer> integerStream = stream.flatMap(x -> Arrays.stream(x).boxed());
        String collect = integerStream.map(String::valueOf).collect(Collectors.joining(", "));
        // collect = 9, 8, 7, 6, 5, 4, 3, 1, 0
        System.out.println("collect = " + collect);
    }

    /**
     * description: 对整型数组使用冒泡排序（降序排序）
     * @author 朱正磊
     * @date 2022-06-26 17:38:35
     * @param intArray 整型数组
     */
    private void sortedDesc(int[] intArray) {
        for (int i = 0; i < intArray.length; i++) {
            for (int j = i + 1; j < intArray.length; j++) {
                // 如果前一个数比后一个数小，那么交换顺序（降序）
                if (intArray[i] < intArray[j]) {
                    int temp = intArray[i];
                    intArray[i] = intArray[j];
                    intArray[j] = temp;
                }
            }
        }
    }

    /**
     * description: 测试对整型数组使用冒泡排序
     * @author 朱正磊
     * @date 2022-06-27 10:27:19
     */
    @Test
    void test3() {
        int[] intArray = {3, 6, 9, 1, 4, 8, 7, 0, 5};
        System.out.println("开始进行升序排序...");
        this.sorted(intArray, true);
        for (int i = 0; i < intArray.length; i++) {
            // 0, 1, 3, 4, 5, 6, 7, 8, 9,
            System.out.print(intArray[i] + ", ");
        }

        System.out.println();

        System.out.println("开始进行降序排序...");
        this.sorted(intArray, false);
        for (int value : intArray) {
            // 9, 8, 7, 6, 5, 4, 3, 1, 0,
            System.out.print(value + ", ");
        }
    }

    /**
     * description: 对整型数组按需排序（底层使用冒泡排序思想）
     * @author 朱正磊
     * @date 2022-06-27 10:23:45
     * @param intArray 整型数组
     * @param sortedRule 排序规则：true表示升序，false表示降序
     */
    private void sorted(int[] intArray, boolean sortedRule) {
        for (int i = 0; i < intArray.length; i++) {
            for (int j = i + 1; j < intArray.length; j++) {
                if (sortedRule) {
                    // 如果前一个数比后一个数大，那么交换顺序（升序）
                    if (intArray[i] > intArray[j]) {
                        int temp = intArray[i];
                        intArray[i] = intArray[j];
                        intArray[j] = temp;
                    }
                } else {
                    // 如果前一个数比后一个数小，那么交换顺序（降序）
                    if (intArray[i] < intArray[j]) {
                        int temp = intArray[i];
                        intArray[i] = intArray[j];
                        intArray[j] = temp;
                    }
                }
            }
        }
    }

}
